#!/bin/bash
# 注意需要将main_.go go.mod go.sum  main.go exec.env和本脚本置于同一文件夹下,我们已经给出对应的main_.go和exec.env文件
# 要删除的目录路径
SOURCE_DIR=$(pwd)
TARGET_DIR="/home/precompile"
BIN_DIR="/home/precompile/bin"
SRC_DIR="/home/precompile/src"
BUILD_DIR="/action/action/src"
CONTAINER_DIR="/action/action"
CONTAINER_NAME="golangcompiler"
ZIP_FILE="main-bin.zip"
# 检查目录是否存在
if [ -d "$TARGET_DIR" ]; then
  echo "删除目录: $TARGET_DIR"
  # 递归删除目录及其所有内容
  rm -rf "$TARGET_DIR"
  echo "目录已成功删除。"
else
  echo "目录 $TARGET_DIR 不存在。"
fi

# 创建对应的目录
mkdir -p "$TARGET_DIR" "$BIN_DIR" "$SRC_DIR"
echo "目录已创建"

#将当前目录下的go.mod go.sum  main.go main_.go拷贝一份到目标对应的src目录下
# 定义要复制的文件列表
FILES_SRC_TO_COPY=("go.mod" "go.sum"  "main.go" "main__.go")
# 遍历文件列表并复制每个文件
for FILE in "${FILES_SRC_TO_COPY[@]}"; do
  SOURCE_FILE="$SOURCE_DIR/$FILE"
  TARGET_FILE="$SRC_DIR/$FILE"
  
  # 检查源文件是否存在
  if [ -f "$SOURCE_FILE" ]; then
    cp "$SOURCE_FILE" "$TARGET_FILE"
    echo "复制 $FILE 到 $SRC_DIR"
  else
    echo "源文件 $SOURCE_FILE 不存在，退出脚本。"
    exit 1
  fi
done

#将当前目录下的go.mod go.sum  main.go main_.go拷贝一份到目标对应的bin目录下
# 定义要复制的文件列表
FILES_BIN_TO_COPY=("exec.env")
# 遍历文件列表并复制每个文件
for FILE in "${FILES_BIN_TO_COPY[@]}"; do
  SOURCE_FILE="$SOURCE_DIR/$FILE"
  TARGET_FILE="$BIN_DIR/$FILE"
  
  # 检查源文件是否存在
  if [ -f "$SOURCE_FILE" ]; then
    cp "$SOURCE_FILE" "$TARGET_FILE"
    echo "复制 $FILE 到 $BIN_DIR"
  else
    echo "源文件 $SOURCE_FILE 不存在，退出脚本。"
    exit 1
  fi
done

#先拉取镜像crpi-oq5bohe8x1biovgq.cn-shanghai.personal.cr.aliyuncs.com/zbm_hub/openwhisk-go-1.20-nightly:v1.0,如果已经有了就跳过
# 定义镜像名称和标签
IMAGE_NAME="crpi-oq5bohe8x1biovgq.cn-shanghai.personal.cr.aliyuncs.com/zbm_hub/action-go-runtime"
IMAGE_TAG="v1.21.0"
IMAGE="$IMAGE_NAME:$IMAGE_TAG"

# 检查本地是否已存在该镜像
if docker inspect --type=image "$IMAGE" > /dev/null 2>&1; then
  echo "镜像 $IMAGE 已存在，跳过拉取。"
else
  echo "镜像 $IMAGE 不存在，开始拉取..."
  docker pull "$IMAGE"
  if [ $? -eq 0 ]; then
    echo "镜像 $IMAGE 拉取成功。"
  else
    echo "镜像 $IMAGE 拉取失败。"
    exit 1
  fi
fi

# 以IMAGE镜像启动一个名为golangcompiler的预编译容器，需要将本地的TARGET_DIR和容器内的/action/action目录做绑定
# 启动容器
echo "启动容器 $CONTAINER_NAME..."
docker run -d \
  --name "$CONTAINER_NAME" \
  -v "$TARGET_DIR:$CONTAINER_DIR" \
  "$IMAGE"

# 检查容器是否启动成功
if [ $? -eq 0 ]; then
  echo "容器 $CONTAINER_NAME 启动成功。"
else
  echo "容器 $CONTAINER_NAME 启动失败。"
  exit 1
fi

#在docker容器的"$CONTAINER_DIR/src"目录下调用go build -o exec生成对应的二进制文件
# 在容器内执行 go build 命令
echo "在容器 $CONTAINER_NAME 的 $BUILD_DIR 目录下执行 go build -o exec"
docker exec -w "$BUILD_DIR" "$CONTAINER_NAME" go build -o exec

# 检查命令是否执行成功
if [ $? -eq 0 ]; then
  echo "二进制文件 build 成功。"
else
  echo "二进制文件 build 失败。"
  exit 1
fi

#将SRC_DIR下的exec文件移动到BIN_DIR,并打包成main-bin.zip
# 检查 exec 文件是否存在
if [ ! -f "$SRC_DIR/exec" ]; then
  echo "源目录 $SRC_DIR 下未找到 exec 文件。"
  exit 1
fi

# 将 exec 文件移动到目标目录
echo "将 exec 文件从 $SRC_DIR 移动到 $BIN_DIR..."
mv "$SRC_DIR/exec" "$BIN_DIR/"

# 检查移动是否成功
if [ $? -ne 0 ]; then
  echo "移动 exec 文件失败。"
  exit 1
fi

# 打包目标目录下的 exec 文件
echo "打包 $BIN_DIR/exec 和 BIN_DIR/exec.env 为 $ZIP_FILE..."
zip -j "$BIN_DIR/$ZIP_FILE" "$BIN_DIR/exec" "$BIN_DIR/exec.env"

# 检查打包是否成功
if [ $? -eq 0 ]; then
  echo "打包成功，生成文件：$BIN_DIR/$ZIP_FILE"
else
  echo "打包失败。"
  exit 1
fi

# 将打包完成后的ZIP_FILE转移到SOURCE_DIR下
# 将打包完成后的 ZIP_FILE 转移到 SOURCE_DIR
echo "将 $BIN_DIR/$ZIP_FILE 转移到 $SOURCE_DIR..."
mv "$BIN_DIR/$ZIP_FILE" "$SOURCE_DIR/"

# 检查转移是否成功
if [ $? -eq 0 ]; then
  echo "转移成功，文件已移动到 $SOURCE_DIR/$ZIP_FILE"
else
  echo "转移失败。"
  exit 1
fi

#最后关闭并删除golangcompiler的预编译容器
# 检查容器是否存在
if docker ps -a -q -f name="$CONTAINER_NAME" > /dev/null; then
  echo "找到容器 $CONTAINER_NAME，正在关闭并删除..."

  # 停止容器
  echo "停止容器 $CONTAINER_NAME..."
  docker stop "$CONTAINER_NAME"

  # 检查停止是否成功
  if [ $? -eq 0 ]; then
    echo "容器 $CONTAINER_NAME 已停止。"
  else
    echo "停止容器 $CONTAINER_NAME 失败。"
    exit 1
  fi

  # 删除容器
  echo "删除容器 $CONTAINER_NAME..."
  docker rm "$CONTAINER_NAME"

  # 检查删除是否成功
  if [ $? -eq 0 ]; then
    echo "容器 $CONTAINER_NAME 已删除。"
  else
    echo "删除容器 $CONTAINER_NAME 失败。"
    exit 1
  fi
else
  echo "未找到容器 $CONTAINER_NAME。"
  exit 1
fi

echo "precompile成功"
# 预编译完成后可参照如下指令更新或创建action     
# wsk action update mongo main-bin.zip --main main --kind go:1.20 --insecure